#include"Dictionary.hpp"
#include"Dict.hpp"
#include"Command.hpp"

//这是做测试的回调函数
std::string defaulthandler(const std::string &word,InetAddr &addr)
{
    LOG(LogLevel::DEBUG) << "回调到了defaulthandler"; 
    std::string s = "haha, ";
    s += word;
    return s;
}

void Usage(std::string proc)
{
    std::cerr << "Usage" << proc << " prot" << std::endl;    //如果系统参数不是2   报错提示，程序名 + 端口号
}

//对于TCPServer端   只需要  ./tcpserver  port    (文件名 + 端口号)
int main(int argc,char *argv[])
{ 
    //命令行参数传错
    if(argc != 2)
    {
        Usage(argv[0]);
        exit(USAGE_ERR);
    }

    uint16_t port = std::stoi(argv[1]);

    Enable_Console_Log_Strategy();    //引进日志策略    

//字典查询业务
    //想要字典功能   需要有翻译模块
    //1. 翻译模块
    // Dict d;
    // d.LoadDict();    //把字典载入进来

//想让tcp来完成翻译  [](){}    网络中收到了对应的请求和字符串会回调匿名函数  绑定Dict对象
    // std::unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>(port,[&d](const std::string &word,InetAddr &addr){
    //     return d.Translate(word,addr);
    // });




//命令执行模块（包含上层）
    Command cmd;
    //要执行类内命令     ---->     std::string Execute(const std::string &cmd,InetAddr &addr);
 //方法一写法：可以同上面翻译表达式   [](){}
    // std::unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>(port,[&cmd](const std::string &command,InetAddr &addr){
    //    return cmd.Execute(command,addr);     
    // })


//方法二写法：
    func_t f = std::bind(&Command::Execute,&cmd,std::placeholders::_1,std::placeholders::_2);
    std::unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>(port,f);
//这种方法：也是一种变相参数绑定   形成函数对象，函数是Execute，参数绑定一个Command对象（cmd的this指针），后两个参数是预留的
//这两个预留参数---> 未来使用Execute需要传递的两个参数   回调的两个参数

    tsvr->Init();
    tsvr->Run();

    return 0;

}